#ifndef CONFIGMANAGER_H
#define CONFIGMANAGER_H

#include <QObject>
#include <QVariantMap>
#include <QStringList>

/**
 * @brief 配置管理类
 * 用于管理应用程序的多种配置，每种配置包含多个参数
 * - 配置类型：每种配置有一个唯一的配置名称
 * - 参数：每种配置包含多个参数，每个参数有一个唯一的参数名称
 */
class ConfigManager : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父对象
     */
    explicit ConfigManager(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~ConfigManager();
    
    // ========== 配置级别的操作 ==========
    
    /**
     * @brief 添加新的配置
     * @param configName 配置名称（唯一标识）
     * @param configParams 配置参数，键为参数名称
     */
    void addConfig(const QString &configName, const QVariantMap &configParams = QVariantMap());
    
    /**
     * @brief 移除指定配置
     * @param configName 配置名称（唯一标识）
     */
    void removeConfig(const QString &configName);
    
    /**
     * @brief 检查配置是否存在
     * @param configName 配置名称（唯一标识）
     * @return 是否存在
     */
    bool containsConfig(const QString &configName) const;
    
    /**
     * @brief 获取所有配置名称列表
     * @return 配置名称列表
     */
    QStringList getConfigNames() const;
    
    /**
     * @brief 清除所有配置
     */
    void clearAllConfigs();
    
    // ========== 配置参数级别的操作 ==========
    
    /**
     * @brief 设置配置的所有参数
     * @param configName 配置名称（唯一标识）
     * @param configParams 配置参数，键为参数名称
     */
    void setConfigParams(const QString &configName, const QVariantMap &configParams);
    
    /**
     * @brief 获取配置的所有参数
     * @param configName 配置名称（唯一标识）
     * @return 配置参数，键为参数名称
     */
    QVariantMap getConfigParams(const QString &configName) const;
    
    /**
     * @brief 获取配置的单个参数
     * @param configName 配置名称（唯一标识）
     * @param paramName 参数名称（唯一标识）
     * @param defaultValue 默认值
     * @return 参数值，如果不存在则返回默认值
     */
    QVariant getConfigParam(const QString &configName, const QString &paramName, 
                           const QVariant &defaultValue = QVariant()) const;
    
    /**
     * @brief 设置配置的单个参数
     * @param configName 配置名称（唯一标识）
     * @param paramName 参数名称（唯一标识）
     * @param value 参数值
     */
    void setConfigParam(const QString &configName, const QString &paramName, 
                       const QVariant &value);
    
    /**
     * @brief 检查配置中是否包含指定参数
     * @param configName 配置名称（唯一标识）
     * @param paramName 参数名称（唯一标识）
     * @return 是否包含
     */
    bool containsConfigParam(const QString &configName, const QString &paramName) const;
    
    /**
     * @brief 移除配置中的指定参数
     * @param configName 配置名称（唯一标识）
     * @param paramName 参数名称（唯一标识）
     */
    void removeConfigParam(const QString &configName, const QString &paramName);
    
    /**
     * @brief 获取配置的所有参数名称
     * @param configName 配置名称（唯一标识）
     * @return 参数名称列表
     */
    QStringList getConfigParamNames(const QString &configName) const;
    
    /**
     * @brief 批量设置配置的参数
     * @param configName 配置名称（唯一标识）
     * @param configParams 配置参数，键为参数名称
     */
    void batchSetConfigParams(const QString &configName, const QVariantMap &configParams);
    
    /**
     * @brief 批量获取配置的参数
     * @param configName 配置名称（唯一标识）
     * @param paramNames 参数名称列表
     * @return 配置参数，键为参数名称
     */
    QVariantMap batchGetConfigParams(const QString &configName, const QStringList &paramNames) const;
    
    // ========== 文件操作 ==========
    
    /**
     * @brief 从文件加载配置
     * @param filePath 文件路径
     * @return 是否加载成功
     */
    bool loadConfig(const QString &filePath = QString());
    
    /**
     * @brief 保存配置到文件
     * @param filePath 文件路径
     * @return 是否保存成功
     */
    bool saveConfig(const QString &filePath = QString());

signals:
    /**
     * @brief 配置参数变更信号
     * @param configName 配置名称（唯一标识）
     * @param paramName 参数名称（唯一标识）
     * @param oldValue 旧值
     * @param newValue 新值
     */
    void configParamChanged(const QString &configName, const QString &paramName, 
                           const QVariant &oldValue, const QVariant &newValue);
    
    /**
     * @brief 配置参数批量变更信号
     * @param configName 配置名称（唯一标识）
     * @param changedParams 变更的配置参数，键为参数名称，值为新值
     */
    void configParamsChanged(const QString &configName, const QVariantMap &changedParams);
    
    /**
     * @brief 配置添加信号
     * @param configName 配置名称（唯一标识）
     */
    void configAdded(const QString &configName);
    
    /**
     * @brief 配置移除信号
     * @param configName 配置名称（唯一标识）
     */
    void configRemoved(const QString &configName);
    
    /**
     * @brief 配置加载完成信号
     * @param success 是否加载成功
     */
    void configLoaded(bool success);
    
    /**
     * @brief 配置保存完成信号
     * @param success 是否保存成功
     */
    void configSaved(bool success);

private:
    QVariantMap m_configs;               // 存储所有配置，键为配置名称，值为配置参数（键为参数名称）
    QString m_configFilePath;            // 配置文件路径
    const QString m_defaultConfigName = "default"; // 默认配置名称
};

#endif // CONFIGMANAGER_H
